// package cn.seaboot.admin.mvc.utils;
//
// import cn.seaboot.commons.file.IOUtils;
// import cn.seaboot.commons.file.MimeUtils;
// import org.apache.pdfbox.cos.COSName;
// import org.apache.pdfbox.io.MemoryUsageSetting;
// import org.apache.pdfbox.multipdf.PDFMergerUtility;
// import org.apache.pdfbox.pdmodel.PDDocument;
// import org.apache.pdfbox.pdmodel.PDPage;
// import org.apache.pdfbox.pdmodel.PDPageContentStream;
// import org.apache.pdfbox.pdmodel.PDResources;
// import org.apache.pdfbox.pdmodel.font.PDType1Font;
// import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
// import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;
// import org.apache.pdfbox.rendering.PDFRenderer;
// import org.apache.pdfbox.text.PDFTextStripper;
// import org.apache.pdfbox.util.Matrix;
//
// import javax.imageio.ImageIO;
// import java.awt.image.BufferedImage;
// import java.io.*;
// import java.util.Iterator;
//
// /**
//  * 输出IO不关闭
//  * API: https:// pdfbox.apache.org/docs/2.0.1/javadocs/
//  *
//  * @author Mr.css 2018年11月29日 下午2:52:49
//  */
// public class PdfBoxUtil {
//
//     public static void merge(String f1, String f2, OutputStream os) throws IOException {
//         merge(new File(f1), new File(f2), os);
//     }
//
//     public static void merge(File f1, File f2, OutputStream os) throws IOException {
//         try (InputStream is1 = new FileInputStream(f1); InputStream is2 = new FileInputStream(f2)) {
//             merge(is1, is2, os);
//         }
//     }
//
//     public static void merge(InputStream pdfIs1, InputStream pdfIs2, OutputStream os) throws IOException {
//         //  Instantiating PDFMergerUtility class
//         PDFMergerUtility merger = new PDFMergerUtility();
//
//         //  Setting the destination file
//         merger.setDestinationStream(os);
//
//         //  Loading an existing PDF document
//         merger.addSource(pdfIs1);
//         merger.addSource(pdfIs2);
//
//         //  Merging the two documents
//         MemoryUsageSetting setting = MemoryUsageSetting.setupMainMemoryOnly();
//         merger.mergeDocuments(setting);
//     }
//
//     public static String readString(String file) throws IOException {
//         return readString(new File(file));
//     }
//
//     public static String readString(File file) throws IOException {
//         try (InputStream is = IOUtils.openFileInputStream(file)) {
//             return readString(is);
//         }
//     }
//
//     public static String readString(InputStream is) throws IOException {
//         PDDocument document = PDDocument.load(is);
//         try {
//             //  Instantiate PDFTextStripper class
//             PDFTextStripper pdfStripper = new PDFTextStripper();
//
//             //  Retrieving text from PDF document
//             return pdfStripper.getText(document);
//         } finally {
//             //  Closing the document
//             document.close();
//         }
//     }
//
//     public static void markLogoFirstPage(String pdfIs, String logoFile, OutputStream os) throws IOException {
//         markLogoFirstPage(new File(pdfIs), new File(logoFile), os);
//     }
//
//     public static void markLogoFirstPage(File pdfIs, File logoFile, OutputStream os) throws IOException {
//         try (InputStream is = IOUtils.openFileInputStream(pdfIs)){
//             markLogoFirstPage(is, logoFile, os);
//         }
//     }
//
//     public static void markLogoFirstPage(InputStream pdfIs, File logoFile, OutputStream os) throws IOException {
//         // Loading an existing document
//         PDDocument doc = PDDocument.load(pdfIs);
//         try {
//             // Retrieving the page
//             PDPage page = doc.getPage(0);
//
//             //  Creating PDImageXObject object
//             //  because different kinds of image has different read methods,
//             //  so createFromFileByExtension() first parameter is File, not a inputStream;
//             PDImageXObject pdImage = PDImageXObject.createFromFileByExtension(logoFile, doc);
//
//             //  OVERWRITE:clear content,and write new text  APPEND:on content PREPEND:under content
//             PDPageContentStream contents = new PDPageContentStream(doc, page, PDPageContentStream.AppendMode.PREPEND, true, true);
//
//             try {
//                 // Drawing the image in the PDF document
//                 contents.drawImage(pdImage, 20, 20);
//             } finally {
//                 // Closing the PDPageContentStream object
//                 contents.close();
//             }
//
//             // Saving the document
//             doc.save(os);
//         } finally {
//             // Closing the document
//             doc.close();
//         }
//     }
//
//     public static void markTxt(String file, OutputStream os,
//                                String mainTxt, String rootTxt,
//                                Matrix mainMatrix
//     ) throws IOException {
//         markTxt(new File(file), os, mainTxt, rootTxt, mainMatrix);
//     }
//
//     public static void markTxt(File file, OutputStream os,
//                                String mainTxt, String rootTxt,
//                                Matrix mainMatrix
//     ) throws IOException {
//         try (InputStream is = IOUtils.openFileInputStream(file)){
//             markTxt(is, os, mainTxt, rootTxt, mainMatrix);
//         }
//     }
//
//     /**
//      * @param mainMatrix double degree, float x, float y
//      */
//     public static void markTxt(InputStream is, OutputStream os,
//                                String mainTxt, String rootTxt,
//                                Matrix mainMatrix
//     ) throws IOException {
//         PDDocument doc = PDDocument.load(is);
//         try {
//             doc.setAllSecurityToBeRemoved(true);
//             for (PDPage page : doc.getPages()) {
//                 PDPageContentStream cs = new PDPageContentStream(doc, page, PDPageContentStream.AppendMode.APPEND, true, true);
//                 try {
//                     //  Alpha
//                     PDExtendedGraphicsState r0 = new PDExtendedGraphicsState();
//                     r0.setNonStrokingAlphaConstant(0.2f);
//                     r0.setAlphaSourceFlag(true);
//
//                     cs.setGraphicsStateParameters(r0);
//                     //  Red
//                     cs.setNonStrokingColor(200, 0, 0);
//                     cs.beginText();
//
//                     float fontSize = 50.0f;
//                     cs.setFont(PDType1Font.HELVETICA_OBLIQUE, fontSize);
//                     cs.setTextMatrix(mainMatrix);
//                     cs.showText(mainTxt);
//
//                     cs.setFont(PDType1Font.HELVETICA_OBLIQUE, 10.0f);
//                     cs.setTextMatrix(Matrix.getRotateInstance(0, 40f, 20f));
//                     cs.showText(rootTxt);
//
//                     cs.endText();
//                 } finally {
//                     cs.close();
//                 }
//             }
//             doc.save(os);
//         } finally {
//             doc.close();
//         }
//     }
//
//     /**
//      * E.G.
//      */
//     public void pdfToImage() throws IOException {
//         //  Loading an existing PDF document
//         File file = new File("C:\\Users\\12614\\Desktop\\test2.pdf");
//         PDDocument document = PDDocument.load(file);
//
//         //  Instantiating the PDFRenderer class
//         PDFRenderer renderer = new PDFRenderer(document);
//
//         //  Rendering an image from the PDF document
//         BufferedImage image = renderer.renderImage(0);
//
//         //  Writing the image to a file
//         ImageIO.write(image, "JPEG", new File("C:\\Users\\12614\\Desktop\\myimage.jpg"));
//
//         //  Closing the document
//         document.close();
//     }
//
//     /**
//      * E.G.
//      */
//     public void saveAllImageFromPdf(String pdf, String imgRoot) throws IOException {
//         //  Loading an existing PDF document
//         File file = new File(pdf);
//         PDDocument doc = PDDocument.load(file);
//
//         //  iterate all pages
//         int cnt = 0;
//         for (PDPage page : doc.getPages()) {
//             PDResources resources = page.getResources();
//             Iterable<COSName> xobjects = resources.getXObjectNames();
//             if (xobjects != null) {
//                 Iterator<COSName> imageIter = xobjects.iterator();
//                 //  iterate all image
//                 while (imageIter.hasNext()) {
//                     COSName key = imageIter.next();
//                     if (resources.isImageXObject(key)) {
//                         try {
//                             PDImageXObject image = (PDImageXObject) resources.getXObject(key);
//                             BufferedImage bimage = image.getImage();
//                             ImageIO.write(bimage, MimeUtils.PNG, new File(imgRoot + (cnt++) + "." + MimeUtils.PNG));
//                         } catch (Exception ignore) {
//                         }
//                     }
//                 }
//             }
//         }
//     }
// }
